package com.sington;

public class Sington {
    private static volatile Sington instance;

    private Sington() {

    }

    public static Sington getInstance() {
        if (instance == null) {
            synchronized (Sington.class) {
                if (instance == null) {
                    /**
                     * 这里不是原子性的
                     * 1、分配内存空间
                     * 2、执行构造方法
                     * 3、指针指向对象
                     *
                     * 多步操作可能出现指令重排（由编译器决定），出现132的情况，也就是还没有构造，就已经指针指向了
                     * volatile可以防止指令重排
                     */
                    instance = new Sington();
                }
            }
        }
        return instance;
    }
}
